package com.example.erat.util;

import com.example.erat.constant.SystemConstant;
import com.example.erat.entity.Experiment;
import com.example.erat.entity.Student;
import com.example.erat.exception.StudentFileNameException;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 文件工具类
 */
@Slf4j
public class FileUtil {

    /**
     * 实验文件名正则表达式：实验X_学号_姓名.后缀
     */
    private static final Pattern FILE_NAME_PATTERN = Pattern.compile("实验(\\d+)_([\\d\\w]+)_([^.]+)\\.(\\w+)");
    
    /**
     * 扫描实验文件夹，获取已提交的学生信息
     * 
     * @param folderPath 实验文件夹路径
     * @param experiment 实验信息
     * @param students 学生列表
     * @return 已提交的学生列表和未提交的学生列表
     */
    public static Map<String, List<Student>> scanExperimentFolder(String folderPath, Experiment experiment, List<Student> students) {
        Map<String, List<Student>> result = new HashMap<>();
        List<Student> submittedStudents = new ArrayList<>();
        List<Student> unsubmittedStudents = new ArrayList<>();
        
        // 学号到学生的映射
        Map<String, Student> studentMap = new HashMap<>();
        for (Student student : students) {
            studentMap.put(student.getStudentId(), student);
        }
        
        // 调试信息：打印所有学号，用于排查 - 在处理前只打印一次
        log.info("当前班级所有学号: {}", studentMap.keySet());
        
        // 已提交学生的学号集合
        Map<String, Boolean> submittedStudentIds = new HashMap<>();
        
        // 扫描文件夹
        File folder = new File(folderPath);
        if (!folder.exists() || !folder.isDirectory()) {
            log.warn("实验文件夹不存在或不是文件夹: {}", folderPath);
            unsubmittedStudents.addAll(students);
            result.put("submitted", submittedStudents);
            result.put("unsubmitted", unsubmittedStudents);
            return result;
        }
        
        // 扫描文件夹
        File[] files = folder.listFiles();
        if (files != null) {
            for (File file : files) {
                if (file.isFile()) {
                    String fileName = file.getName();
                    try {
                        // 解析文件名
                        Matcher matcher = FILE_NAME_PATTERN.matcher(fileName);
                        if (matcher.matches()) {
                            String experimentNumber = matcher.group(1);
                            String studentId = matcher.group(2);
                            String studentName = matcher.group(3);
                            
                            // 调试信息：打印匹配到的学号
                            log.info("文件名匹配到的学号: '{}', 姓名: '{}'", studentId, studentName);
                            
                            // 如果学生已经被标记为提交，则跳过不再处理
                            if (submittedStudentIds.containsKey(studentId)) {
                                log.info("学生 {} 已标记为提交，跳过文件 {}", studentId, fileName);
                                continue;
                            }
                            
                            // 检查学生是否存在 - 使用完整学生列表比对
                            Student student = studentMap.get(studentId);
                            if (student == null) {
                                log.warn("学号为{}的学生不存在于系统中，文件{}被忽略", studentId, fileName);
                                continue; // 跳过此文件，继续处理下一个
                            }
                            
                            // 检查学生姓名是否匹配
                            if (!student.getName().equals(studentName)) {
                                log.warn("学号为{}的学生姓名不匹配，系统中为{}，文件中为{}", studentId, student.getName(), studentName);
                            }
                            
                            // 标记学生已提交
                            submittedStudentIds.put(studentId, true);
                            
                        } else {
                            log.warn("文件名格式不符合规范: {}", fileName);
                        }
                    } catch (Exception e) {
                        log.error("解析文件名异常: {}", fileName, e);
                    }
                }
            }
        }
        
        // 分类已提交和未提交的学生
        for (Student student : students) {
            if (submittedStudentIds.containsKey(student.getStudentId())) {
                submittedStudents.add(student);
            } else {
                unsubmittedStudents.add(student);
            }
        }
        
        result.put("submitted", submittedStudents);
        result.put("unsubmitted", unsubmittedStudents);
        return result;
    }
    
    /**
     * 获取文件后缀
     * 
     * @param fileName 文件名
     * @return 文件后缀（带.）
     */
    public static String getFileSuffix(String fileName) {
        int dotIndex = fileName.lastIndexOf('.');
        if (dotIndex > 0) {
            return fileName.substring(dotIndex);
        }
        return "";
    }
    
    /**
     * 检查文件是否为Excel文件
     * 
     * @param fileName 文件名
     * @return 是否为Excel文件
     */
    public static boolean isExcelFile(String fileName) {
        String suffix = getFileSuffix(fileName);
        return SystemConstant.FileConstant.EXCEL_SUFFIX.equals(suffix);
    }
    
    /**
     * 检查文件是否为CSV文件
     * 
     * @param fileName 文件名
     * @return 是否为CSV文件
     */
    public static boolean isCsvFile(String fileName) {
        String suffix = getFileSuffix(fileName);
        return SystemConstant.FileConstant.CSV_SUFFIX.equals(suffix);
    }
} 